1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static com.google.common.collect.Multisets.setCountImpl;
20
21 import com.google.common.annotations.GwtCompatible;
22 import com.google.common.base.Objects;
23
24 import java.util.AbstractCollection;
25 import java.util.Collection;
26 import java.util.Iterator;
27 import java.util.Set;
28
29 import javax.annotation.Nullable;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 @GwtCompatible
47 abstract class AbstractMultiset<E> extends AbstractCollection<E>
48 implements Multiset<E> {
49
50
51 @Override public int size() {
52 return Multisets.sizeImpl(this);
53 }
54
55 @Override public boolean isEmpty() {
56 return entrySet().isEmpty();
57 }
58
59 @Override public boolean contains(@Nullable Object element) {
60 return count(element) > 0;
61 }
62
63 @Override public Iterator<E> iterator() {
64 return Multisets.iteratorImpl(this);
65 }
66
67 @Override
68 public int count(@Nullable Object element) {
69 for (Entry<E> entry : entrySet()) {
70 if (Objects.equal(entry.getElement(), element)) {
71 return entry.getCount();
72 }
73 }
74 return 0;
75 }
76
77
78
79 @Override public boolean add(@Nullable E element) {
80 add(element, 1);
81 return true;
82 }
83
84 @Override
85 public int add(@Nullable E element, int occurrences) {
86 throw new UnsupportedOperationException();
87 }
88
89 @Override public boolean remove(@Nullable Object element) {
90 return remove(element, 1) > 0;
91 }
92
93 @Override
94 public int remove(@Nullable Object element, int occurrences) {
95 throw new UnsupportedOperationException();
96 }
97
98 @Override
99 public int setCount(@Nullable E element, int count) {
100 return setCountImpl(this, element, count);
101 }
102
103 @Override
104 public boolean setCount(@Nullable E element, int oldCount, int newCount) {
105 return setCountImpl(this, element, oldCount, newCount);
106 }
107
108
109
110
111
112
113
114
115
116 @Override public boolean addAll(Collection<? extends E> elementsToAdd) {
117 return Multisets.addAllImpl(this, elementsToAdd);
118 }
119
120 @Override public boolean removeAll(Collection<?> elementsToRemove) {
121 return Multisets.removeAllImpl(this, elementsToRemove);
122 }
123
124 @Override public boolean retainAll(Collection<?> elementsToRetain) {
125 return Multisets.retainAllImpl(this, elementsToRetain);
126 }
127
128 @Override public void clear() {
129 Iterators.clear(entryIterator());
130 }
131
132
133
134 private transient Set<E> elementSet;
135
136 @Override
137 public Set<E> elementSet() {
138 Set<E> result = elementSet;
139 if (result == null) {
140 elementSet = result = createElementSet();
141 }
142 return result;
143 }
144
145
146
147
148
149 Set<E> createElementSet() {
150 return new ElementSet();
151 }
152
153 class ElementSet extends Multisets.ElementSet<E> {
154 @Override
155 Multiset<E> multiset() {
156 return AbstractMultiset.this;
157 }
158 }
159
160 abstract Iterator<Entry<E>> entryIterator();
161
162 abstract int distinctElements();
163
164 private transient Set<Entry<E>> entrySet;
165
166 @Override public Set<Entry<E>> entrySet() {
167 Set<Entry<E>> result = entrySet;
168 if (result == null) {
169 entrySet = result = createEntrySet();
170 }
171 return result;
172 }
173
174 class EntrySet extends Multisets.EntrySet<E> {
175 @Override Multiset<E> multiset() {
176 return AbstractMultiset.this;
177 }
178
179 @Override public Iterator<Entry<E>> iterator() {
180 return entryIterator();
181 }
182
183 @Override public int size() {
184 return distinctElements();
185 }
186 }
187
188 Set<Entry<E>> createEntrySet() {
189 return new EntrySet();
190 }
191
192
193
194
195
196
197
198
199
200
201 @Override public boolean equals(@Nullable Object object) {
202 return Multisets.equalsImpl(this, object);
203 }
204
205
206
207
208
209
210
211 @Override public int hashCode() {
212 return entrySet().hashCode();
213 }
214
215
216
217
218
219
220
221 @Override public String toString() {
222 return entrySet().toString();
223 }
224 }